#ifndef INTERVAL_TREE_H
#define INTERVAL_TREE_H

#include "types.h"
#include <cstdarg>
#include <vector>

void logger(const char * s, ...);
void enableLog();

#define LOG(msg, ...) \
    { \
        logger("[%s:%03d:%s] " msg "\n", string(__FILE__).substr(string(__FILE__).rfind('/') + 1).c_str(), __LINE__, __func__, ##__VA_ARGS__); \
    }

/**
 * @class IntervalTree
 * @brief 高效管理一组不重叠的内存区间。
 *
 * 这个类用于模拟 HBM 中的内存布局。它内部维护一个有序且合并的区间列表，
 * 支持快速插入、删除、查询总大小以及计算与目标区间的差集等操作。
 * 所有操作都会自动维护区间的有序性和非重叠性。
 */
class IntervalTree {
public:
    /**
     * @brief 插入一个新的区间，并自动与现有区间合并。
     * @param new_interval 要插入的区间。
     */
    void insert(const Interval& new_interval);

    /**
     * @brief 从已加载的区间中移除一个指定的区间。
     *
     * 如果移除的区间只是某个大区间的一部分，则该大区间会被分裂。
     * @param to_remove 要移除的区间。
     */
    void remove(const Interval& to_remove);

    /**
     * @brief 计算所有已加载区间的总大小。
     * @return long long 总大小。
     */
    long long getTotalSize() const;

    /**
     * @brief 查询目标区间与当前树中所有区间的差集。
     *
     * 这个函数非常关键，用于找出目标内存区间中尚未被加载到HBM的部分。
     * @param target 目标查询区间。
     * @return std::vector<Interval> 未被加载的子区间列表。
     */
    void getDifference(const IntervalTree& target, std::vector<Interval> & offloadIntervalSet, std::vector<Interval> & reloadIntervalSet) const;

    /**
     * @brief 获取当前树中所有区间的只读引用。
     * @return const std::vector<Interval>& 区间列表。
     */
    const std::vector<Interval>& getIntervals() const;
    void print(const char * msg) const;

private:
    /**
     * @brief 一个有序且不重叠的区间列表，代表HBM中的内存布局。
     */
    std::vector<Interval> intervals;

    /**
     * @brief 内部辅助函数，用于在插入或删除后重新合并重叠或相邻的区间。
     */
    void merge();
};

#endif // INTERVAL_TREE_H
